%include "boot.inc"
SECTION MBR vstart=0x7c00
	mov ax,cs
	mov ds,ax
	mov ss,ax
	mov es,ax
	mov fs,ax
	mov ax,0xb800
	mov gs,ax
; 通过调用bios的0x10号中断中的0x06号子功能实现清屏操作
	mov ax,0x0600
	mov bh,0x07
	mov cx,0x0
	mov dx,0x184f
	int 0x10
; 通过调用bios的0x10号中断中的0x13号子功能实现打印字符串操作
	;mov dx,0x0
	;mov ax,message
	;mov bp,ax

	;mov cx,5
	;mov ax,0x1301
	;mov bx,0x2

	;int 0x10

; 直接对显卡进行操作实现字符打印
	mov byte [gs:0x00],'1'
	mov byte [gs:0x01],0xA4

	mov byte [gs:0x02],' '
	mov byte [gs:0x03],0xA4

	mov byte [gs:0x04], 'M'
	mov byte [gs:0x05],0xA4

	mov byte [gs:0x06], 'B'
	mov byte [gs:0x07],0xA4

	mov byte [gs:0x08],'R'
	mov byte [gs:0x09],0xA4

; read_disk_m_16需要三个参数，eax放入loader在磁盘中的起始扇区号，bx放入loader应载入内存中的位置，cx放入读取扇区数
; read_disk_m_16函数将放在eax的cx个扇区数据读出并写入bx指向的内存中
	mov eax,LOADER_START_SECTOR
	mov bx,LOADER_BASE_ADDR
	mov cx,4
	call read_disk_m_16

; 64个段描述符为512字节 gdt_prt为6字节 loader_start函数入口地址就是LOADER_BASE_ADDR + 518
	jmp LOADER_BASE_ADDR + 524

read_disk_m_16:
	mov esi,eax
	mov di,cx

	mov dx,0x01f2
	mov al,cl
	out dx,al

	mov eax,esi
	mov cl,8

	mov dx,0x01f3
	out dx,al

	shr eax,cl
	mov dx,0x01f4
	out dx,al

	shr eax,cl
	mov dx,0x01f5
	out dx,al

	shr eax,cl
	mov dx,0x01f6
	or al,0xe0
	out dx,al

	mov dx,0x01f7
	mov al,0x20
	out dx,al

.not_ready:
	nop
	in al,dx
	and al,0x88
	cmp al,0x08
	jnz .not_ready

	mov cx,di
	mov ax,256
	mul cx
	mov cx,ax

	mov dx,0x01f0
.loop_read:
	in ax,dx
	mov [bx],ax
	add bx,2
	loop .loop_read

	ret

; bios要求mbr应为512字节并且最后两个字节为0x55,0xaa
; 所以不满足512字节的部分用0填充，最后两个字节写入0x55, 0xaa
times 510-($-$$) db 0
db 0x55,0xaa
